
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>

#include "httplib.h"

// namespace httplib
// {
//     struct MultipartFormData
//     {
//         std::string name;
//         std::string content;
//         std::string filename;
//         std::string content_type;
//     };
//     using MultipartFormDataItems = std::vector<MultipartFormData>;

//     struct Request
//     {
//         std::string method;
//         std::string path;
//         Headers headers;
//         std::string body;
//         // for server
//         std::string version;
//         Params params;
//         MultipartFormDataMap files;
//         Ranges ranges;
//         bool has_header(const char *key) const;
//         std::string get_header_value(const char *key, size_t id = 0) const;
//         void set_header(const char *key, const char *val);
//         bool has_file(const char *key) const;
//         MultipartFormData get_file_value(const char *key) const;
//     };

//     struct Response
//     {
//         std::string version;
//         int status = -1;
//         std::string reason;
//         Headers headers;
//         std::string body;
//         std::string location; // Redirect location
//         void set_header(const char *key, const char *val);
//         void set_content(const std::string &s, const char *content_type);
//     };

//     class Server
//     {
//         using Handler = std::function<void(const Request &, Response &)>;
//         using Handlers = std::vector<std::pair<std::regex, Handler>>;
//         std::function<TaskQueue *(void)> new_task_queue;
//         Server &Get(const std::string &pattern, Handler handler);
//         Server &Post(const std::string &pattern, Handler handler);
//         Server &Put(const std::string &pattern, Handler handler);
//         Server &Patch(const std::string &pattern, Handler handler);
//         Server &Delete(const std::string &pattern, Handler handler);
//         Server &Options(const std::string &pattern, Handler handler);
//         bool listen(const char *host, int port, int socket_flags = 0);
//     };

//     class Client
//     {
//         Client(const std::string &host, int port);
//         Result Get(const char *path, const Headers &headers);
//         Result Post(const char *path, const char *body, size_t content_length,const char *content_type);
//         Result Post(const char *path, const MultipartFormDataItems &items);
//     };
// }


void Numbers(const httplib::Request &req, httplib::Response &rsp)
{
    if (req.matches.size() > 1) {  // 确保有捕获组
        auto num_str = req.matches[1].str();  // 提取匹配的字符串
        rsp.set_content("Number: " + num_str, "text/plain");
        rsp.status = 200;
    } else {
        rsp.status = 400;  // Bad Request
        rsp.set_content("Invalid URL format", "text/plain");
    }
}
void Hello(const httplib::Request &req, httplib::Response &rsp)
{
    rsp.set_content("Hello World!", "text/plain");
    rsp.status = 200;
}
void Multipart(const httplib::Request &req, httplib::Response &rsp)
{
    auto ret = req.has_file("file");
    if (ret == false)
    {
        std::cout << "not file upload\n";
        rsp.status = 400;
        return;
    }
    const auto &file = req.get_file_value("file");
    rsp.body.clear();
    rsp.body = file.filename; // 文件名称
    rsp.body += "\n";
    rsp.body += file.content; // 文件内容
    rsp.set_header("Content-Type", "text/plain");
    rsp.status = 200;
}
int main()
{
    httplib::Server svr;   // 实例化Server的对象，用来搭建服务器
    svr.Get("/hi", Hello); // 注册一个针对/hi的GET请求的处理函数映射关系
    svr.Get(R"(/numbers/(\d+))", Numbers);
    svr.Post("/multipart", Multipart);
    svr.listen("0.0.0.0", 9090);
    return 0;
}
